import serial
import time
# from threading import Lock
import struct
import binascii
from lock import lock_serial

"""
用于上下位机通信的类
我们的数据在-100到+100之间，先加上100得到0到200的数
0xC1是巡航，0xD1是目标检测中的宿营地（平移），0xD2是封狼居胥（夹方块），0xD3是城池，0xD4是士兵（倒小球），0xD5是打靶，0xA1是姿态调整，0xAC是做动作
0xAC之后带对应的地标的索引，用来确认是哪个动作：1是平移，2是夹方块，3是举旗+亮灯，4是倒小球，5是伸出笔打靶
0xDE之后加 下位机变量的代号，加值；注意数值要在0到255间 ，代号1为下位机的目标速度
"""


class SerialClass:
    def __init__(self, lock, port):  # 传入串口名称
        self.lock = lock
        portx = port
        bps = 115200  # 波特率
        self.serial = serial.Serial(portx, int(bps), timeout=1, parity=serial.PARITY_NONE, stopbits=1)
        time.sleep(1)

    def write_data(self, data2send=[0xAA, 0, 0, 0, 0, 0xFF]):  # 帧头 任务标志 数据长度 x y z 帧尾
        # lock = Lock()
        self.lock.acquire()
        try:
            self.serial.write(data2send)    # 发送列表数据
            self.serial.flush()             # 等待发送完成
            # TODO 有无必要增加接收确认机制？
        finally:
            self.lock.release()

    def read_data(self):
        """
        下位机发过来任务完成的标志位和计步完成的标志位，数据帧为 0xaa,0x??,0xff.??代表是哪个标志位。
        任务完成：0xaf(task finish)； 计步完成：0xcf(count finish)
        :return:
        """
        result = self.serial.read(3)                # 读3个字节 形式为b'\xaa\xc1\xff'
        aa = binascii.b2a_hex(result)               # 去掉\x ,形式为b'aac1ff'
        bb = aa.decode()                            # 字节流转化为字符串，形式为 aac1ff
        if bb[0:2] == 'aa' and bb[4:6] == 'ff':     # 数据帧首尾检验
            return bb[2:4]                          # 返回标志位帧


# if __name__ == "__main__":
eb_serial_Object = SerialClass(lock_serial, "/dev/ttyUSB0")   # 实例化一个

# while 1:
#     if eb_serial_Object.read_data() == 'af':
#         print('aa===')
#         time.sleep(1)


# data = [0xAA, 0xC1, 0, 0, 200, 0xFF]  # 帧头 任务标志  x y z 帧尾
# serial_connection = Serial("COM14")
